#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#define SIZE 1024
#define MAX_ARGC 64
#define SEP " "


char* argv[MAX_ARGC];
char pwd[SIZE];
char env[SIZE];
int lastcode=0;

const char* HostName()
{
    char* hostname=getenv("HOSTNAME");
    if(hostname) return hostname;
    else return "NONE";
}

char* UserName()
{
    char* username=getenv("USER");
    if(username) return username;
    else return "NONE";
}

char* CurrentWorkDir()
{
    char* currentworkdir=getenv("PWD");
    if(currentworkdir) return currentworkdir;
    else return "NONE";
}

char* Home()
{
    return getenv("HOME");
}

int Interactive(char out[],int size)
{
    printf("[%s@%s %s]$ ",HostName(),UserName(),CurrentWorkDir());
    fgets(out,size,stdin);
    out[strlen(out)-1]=0;
    return strlen(out);
}

void Split(char in[])
{
    int i=0;
    argv[i++]=strtok(in,SEP);
    while(argv[i++]=strtok(NULL,SEP));
    if(strcmp(argv[0],"ls")==0)
    {
        argv[i-1]=(char*)"--color";
        argv[i]=NULL;
    }
}

void Execute()
{
    pid_t id=fork();
    if(id==0)
    {
        execvp(argv[0],argv);
        exit(1);
    }
    int status=0;
    pid_t rid=waitpid(id,&status,0);
    if(rid==id) lastcode=WEXITSTATUS(status);
    //printf("run done, rid: %d\n",rid);

}

int BuildinCmd()
{
    int ret=0;
    if(strcmp("cd",argv[0])==0)
    {
        ret=1;
        char* target = argv[1];
        if(!target) target=Home();  
        chdir(target);
        char temp[1024];
        getcwd(temp,1024);
        snprintf(pwd,SIZE,"PWD=%s",temp);
        putenv(pwd);
    }
    else if(strcmp("export",argv[0])==0)
    {
        ret=1;
        if(argv[1])
        {
            strcpy(env,argv[1]);
            putenv(env);
        }
    }
    else if(strcmp("echo",argv[0])==0)
    {
        ret =1;
        if(argv[1]==NULL) {printf("\n");}
        else{
            if(argv[1][0] == '$') 
            {
                if(argv[1][1] == '?')
                {
                    printf("%d\n",lastcode);
                    lastcode = 0;
                }
                else{
                    char *e=getenv(argv[1]+1);
                    printf("%s\n",e);
                }
            }
            else {
                printf("%s\n",argv[1]);
            }
        }
    }
    return ret;
}

int main()
{
    while(1)
    {
        lastcode=0;
        char commandline[SIZE];
    //1.打印命令行指示符，获取用户输入的命令字符串
        int n=Interactive(commandline,SIZE);
        if(n==0) continue;
    //2.对命令行字符串进行切割
        Split(commandline);
   //3.处理内建命令
        n=BuildinCmd();
        if(n) continue;
   //4.执行该命令
        Execute();
    }
   // int i=0; 
   // for(i=0;argv[i];i++)
   // {
   //     printf("argv[%d]: %s\n",i,argv[i]);
   // }
    return 0;
}


